#include <Kernel/GlobalData.h>
#include <IO/VideoTextMode.h>
#include <Memory/Primitive.h>
#include <Synchronization/SpinLock.h>

SpinLock screen_lock;

/*
@brief 打印字符
@param nChar 字符
@return 打印的字符
*/
int VideoTextModePutChar(int nChar)
{
    nChar &= 0xFF;
    WORD wCursor = VideoTextModeLocateCursor(); /* 光标位置 */
    if ((nChar) >= 20)
    {
        g_VideoTextModeMemory[wCursor] = (WORD)(nChar | g_VideoTextModeColor);
        wCursor++; /* 光标后移 */
        VideoTextModePositionCursor(wCursor); /* 设定光标新位置 */
    }
    else if (nChar == 0)
    {

    }
    else if (nChar == '\b')
    {
        wCursor--; /* 光标前移 */
        VideoTextModePositionCursor(wCursor); /* 设定光标新位置 */
        nChar = ' ';
        g_VideoTextModeMemory[wCursor] = (WORD)nChar;
    }
    else if (nChar == '\t')
    {
        wCursor >>= 3; /* nCursor /= 8，当前处于第几个制表位 */
        wCursor++; /* 下个制表位 */
        wCursor <<= 3; /* nCursor *= 8 */
        VideoTextModePositionCursor(wCursor);
    }
    else if (nChar == '\n')
    {
        wCursor += 80; /* 下一行 */
        VideoTextModePositionCursor(wCursor);
    }
    else if (nChar == '\v')
    {
        wCursor += 80; /* 下一行 */
        VideoTextModePositionCursor(wCursor);
    }
    else if (nChar == '\r')
    {
        wCursor /= 80; /* 当前处于第几行 */
        wCursor *= 80; /* 行首 */
        VideoTextModePositionCursor(wCursor);
    }
    else /* 不可打印字符 */
    {
        VideoTextModePutChar('?');
    }
    return nChar;
}
